/**
 * 
 */
package rer.persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

	





import rer.model.Aluno;
import rer.model.Funcionario;
import rer.model.Turma;
import rer.util.ConexaoJDBC_mysql;

/**
 * @author rickserrat
 *
 */
public class TurmasDAO implements ITurmasDAO {

	private Statement statement;
	private PreparedStatement preparedStatement;
	private ResultSet resultSet;
	private String query;
	private Turma turma;
	private List<Turma> turmas;
	private Connection conexao = ConexaoJDBC_mysql.getConnection();
	private List<Aluno> alunos;
	private Aluno aluno;
	private Funcionario funcionario;
	
	/* (non-Javadoc)
	 * @see rer.persistencia.ITurmasDAO#cadastrar(rer.model.Turma)
	 */
	@Override
	public Boolean cadastrar(Turma turma) {
		// TODO Auto-generated method stub
		try{
			
			query = "INSERT INTO db_ceirr.turmas (nomeTurma, descTurma, statusTurma, Funcionarios_idFunc) VALUES (?, ?, 'A',?)";
			
			preparedStatement = conexao.prepareStatement(query);
			preparedStatement.setString(1, turma.getNomeTurma());
			preparedStatement.setString(2, turma.getDescTurma());
			preparedStatement.setInt(3,turma.getIdFunc());
			
			//l
			System.out.println("Query foi executada retornando true TurmasDAO - Cadastro");
			preparedStatement.execute();
			
			return true;
			
		}catch(SQLException erro){
			System.out.println(erro.getMessage());
		}finally {
			
			try{
				preparedStatement.close();
				//System.out.println("\nStatement fechado");
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("\n Erro ao fechar o objeto statement.");
			}
		}
		System.out.println("\n Erro ao fechar o objeto statement. " + turma.getIdFunc());
		return false;
	}
	/* (non-Javadoc)
	 * @see rer.persistencia.ITurmasDAO#editar(rer.model.Turma)
	 */
	@Override
	public Boolean editar(Turma turma) {
		// TODO Auto-generated method stub
		try{
			
			query = "update db_ceirr.turmas set nomeTurma = ?, descTurma= ?, Funcionarios_idFunc = ? where idTurma = ?";
			
			preparedStatement = conexao.prepareStatement(query);
			preparedStatement.setString(1, turma.getNomeTurma());
			preparedStatement.setString(2, turma.getDescTurma());
			preparedStatement.setInt(3,turma.getIdFunc());
			preparedStatement.setInt(4, turma.getIdTurma());
			
			preparedStatement.executeUpdate();
			
			System.out.println("Dados turma Alterados com sucesso - DAO " + turma.getIdTurma() +" ID func: "+ turma.getIdFunc());
			return true;
			
		}catch(SQLException erro){
			System.out.println(erro.getMessage());
		}finally {
			
			try{
				preparedStatement.close();
				//System.out.println("\nStatement fechado");
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("\n Erro ao fechar o objeto statement.");
			}
		}
		
		return false;
	}
	/* (non-Javadoc)
	 * @see rer.persistencia.ITurmasDAO#deletar(int)
	 */
	@Override
	public Boolean deletar(int id) {
		// TODO Auto-generated method stub
		try{
			
			query = "update db_ceirr.turmas set statusTurma = 'I' where idTurma = ?";
			
			preparedStatement = conexao.prepareStatement(query);
			preparedStatement.setInt(1, id);
			
			preparedStatement.executeUpdate();
			
			System.out.println("\nTurma apagada com sucesso");
			
			return true;
			
		}catch(SQLException erro){
			System.out.println(erro.getMessage());
			
			return false;
		}
	}
	/* (non-Javadoc)
	 * @see rer.persistencia.ITurmasDAO#listar()
	 */
	@Override
	public List<Turma> listar() {
		// TODO Auto-generated method stub
		turmas = null;
		
		try{
			
			query = "SELECT * FROM db_ceirr.turmas where statusTurma ='A'";
			statement = conexao.createStatement();
			resultSet = statement.executeQuery(query);
			
			turmas = new ArrayList<Turma>();
			
			while (resultSet.next()){
				
				turma = new Turma();
				turma.setIdTurma(resultSet.getInt("idTurma"));
				turma.setNomeTurma(resultSet.getString("nomeTurma"));
				turma.setDescTurma(resultSet.getString("descTurma"));
				turma.setStatusTurma(resultSet.getString("statusTurma"));
				turma.setIdFunc(resultSet.getInt("funcionarios_idFunc"));
				turma.setNomeFunc(pesquisaFuncionario(resultSet.getInt("idTurma")));
				
				turmas.add(turma);
				
			}
			
		}catch(SQLException erro){
			System.out.println(erro.getMessage());
		}
		
		try {
			statement.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("\n Erro ao fechar o objeto preparedStatement.");
		}
		System.out.println("\nSucesso pesquisa");
		return turmas;
	}
	/* (non-Javadoc)
	 * @see rer.persistencia.ITurmasDAO#pesquisarTurma(int)
	 */
	@Override
	public Turma pesquisarTurma(int id) {
		// TODO Auto-generated method stub
		turma = null;
		
		try{
			
			query = "SELECT * FROM db_ceirr.turmas WHERE idTurma = ?";
			preparedStatement = conexao.prepareStatement(query);
			
			preparedStatement.setInt(1, id);
			
			resultSet = preparedStatement.executeQuery();
			
			if (resultSet.next()){
				
				turma = new Turma();
				turma.setIdTurma(resultSet.getInt("idTurma"));
				turma.setNomeTurma(resultSet.getString("nomeTurma"));
				turma.setDescTurma(resultSet.getString("descTurma"));
				turma.setStatusTurma(resultSet.getString("statusTurma"));
				turma.setIdFunc(resultSet.getInt("funcionarios_idFunc"));
				
				turmas.add(turma);
								
			}
			
			return turma;
			
		}catch(SQLException erro){
			System.out.println(erro.getMessage());
		} finally{
		
			try {
				preparedStatement.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("\n Erro ao fechar o objeto preparedStatement.");
			}
		}
		
		System.out.println("\nSucesso pesquisa - Turmas");
		
		return null;
	} 
	
	private String pesquisaFuncionario(int id){
		
		String resultado = null;
		
		try{
			FuncionarioDAO funcionarioDAO = new FuncionarioDAO();
			Funcionario funcionario = new Funcionario();
			
			funcionario = funcionarioDAO.pesquisaFuncionario(id);
			
			resultado = funcionario.getNomeFunc();
			
			System.out.println(funcionario.getNomeFunc());
			//return funcionario;
			
		}catch (Exception erro) {
			System.out.println(erro.getMessage());
		}
		return resultado;
	}
	
	@Override
	public List<Turma> listarTodos() {
		// TODO Auto-generated method stub
		turmas = null;
		
		try{
			
			query = "SELECT * FROM db_ceirr.turmas";
			statement = conexao.createStatement();
			resultSet = statement.executeQuery(query);
			
			turmas = new ArrayList<Turma>();
			
			while (resultSet.next()){
				
				turma = new Turma();
				turma.setIdTurma(resultSet.getInt("idTurma"));
				turma.setNomeTurma(resultSet.getString("nomeTurma"));
				turma.setDescTurma(resultSet.getString("descTurma"));
				turma.setStatusTurma(resultSet.getString("statusTurma"));
				turma.setIdFunc(resultSet.getInt("funcionarios_idFunc"));
				turma.setNomeFunc(pesquisaFuncionario(resultSet.getInt("idTurma")));
				
				turmas.add(turma);
				
			}
			
		}catch(SQLException erro){
			System.out.println(erro.getMessage());
		}
		
		try {
			statement.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("\n Erro ao fechar o objeto preparedStatement.");
		}
		System.out.println("\nSucesso pesquisa");
		return turmas;
	}
	@Override
	public List<Aluno> alunos(int idTurma) {
	
		alunos = null;
		
		try{
			
			query = "SELECT A.idAluno, A.nomeAluno FROM db_ceirr.aluno A, db_ceirr.matricula M, db_ceirr.turmas T where M.Turmas_idTurma = T.idTurma  and A.idAluno = M.Aluno_idAluno and A.status in ('A') and T.idTurma = ?";
			
			preparedStatement = conexao.prepareStatement(query);
			
			preparedStatement.setInt(1, idTurma);
			
			resultSet = preparedStatement.executeQuery();
			
			alunos = new ArrayList<Aluno>();
			
			while (resultSet.next()){
				
				aluno = new Aluno();
				aluno.setIdAluno(resultSet.getInt(1));
				aluno.setNomeAluno(resultSet.getString(2));
				
				alunos.add(aluno);
				
			}
			
		}catch(SQLException erro){
			System.out.println(erro.getMessage());
		}finally{
			try {
				preparedStatement.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("\n Erro ao fechar o objeto preparedStatement.");
			}
		}
		
		return alunos;
	}
	@Override
	public Funcionario funcionario(int idTurma) {

		try{
			query = "SELECT F.idFunc, F.nomeFunc FROM db_ceirr.funcionarios F, db_ceirr.turmas T where F.idFunc = T.Funcionarios_idFunc and F.statusFunc in ('A') and T.idTurma = ?";
			
			preparedStatement = conexao.prepareStatement(query);
			preparedStatement.setInt(1, idTurma);
			
			resultSet = preparedStatement.executeQuery();
						
			if (resultSet.next()){
				funcionario = new Funcionario();
				funcionario.setIdFunc(resultSet.getInt(1));
				funcionario.setNomeFunc(resultSet.getString(2));
			}
			
			return funcionario;
			
		}catch(SQLException erro){
			System.out.println(erro.getMessage());
		}finally{
			try {
				preparedStatement.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("\n Erro ao fechar o objeto preparedStatement.");
			}
		}
		
		return null;
	}
	@Override
	public Boolean validarExcluir(int idTurma) {
		
		try{
			
			query = "select count(*) from (SELECT A.idAluno, A.nomeAluno FROM db_ceirr.aluno A, db_ceirr.matricula M, db_ceirr.turmas T where M.Turmas_idTurma = T.idTurma and A.idAluno = M.Aluno_idAluno and A.status in ('A') and T.idTurma = ?) contagem";
			
			preparedStatement = conexao.prepareStatement(query);
			preparedStatement.setInt(1, idTurma);
			
			resultSet = preparedStatement.executeQuery();
			
			if(resultSet.next()){
				int resultado = resultSet.getInt(1);
				
				if(resultado == 0){
					return true;
				}else{
					return false;
				}
			}
			
		}catch(SQLException erro){
			System.out.println(erro.getMessage());
		}finally {
			
			try{
				preparedStatement.close();
				//System.out.println("\nStatement fechado");
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("\n Erro ao fechar o objeto statement.");
			}
		}
		
		return false;
		
	}
	
	
	
	
}
